#ifndef SYMBOLEVALUE_H
#define SYMBOLEVALUE_H

#include <string.h>
#include <iostream>
#include <typeinfo>
using namespace std;

#include "Symbole.h"
#include "Arbre.h"

/*! \file SymboleValue.h
    \brief La spécification de la classe SymboleValue
    
    Décrit la liste des méthodes et attributs associés à la classe SymboleValue
    \author lazzamar
    \date 16/12/2012
 */
/*! \class SymboleValue
    \brief La classe représentant les symbole valués.
    
    Cette classe permet de construire des symboles possédant une valeur.
 Les méthodes suivantes sont utilisés pour afficher le symbole, y accéder et y
 faire un test.
    \li afficher
	\li getValeur
 *  \li setValeur
 *  \li estDefini
*/

class SymboleValue : public Symbole,  // un symbole valué est un symbole qui a une valeur, définie ou pas
                     public Noeud  {  // et c'est aussi une feuille de l'arbre abstrait
public:
	/*! \fn SymboleValue(Symbole s);
		\brief Constructeur de la classe SymboleValue

	 Ce constructeur construit le symbole valué à partir d'un symbole existant.
		\param Symbole s - le symbole existant
	*/
	  SymboleValue(Symbole s); // construit un symbole valué à partir d'un symbole existant s
	  
	  ~SymboleValue( ) {}
	  
	/*! \fn void afficher (unsigned short indentation=0);
		\brief Affiche le noeud dans l'arbre abstrait.

	   Cette fonction affiche le noeud dans l'arbre avec une indentation.
		\param unsigned short indentation - l'indentation dans l'arbre
	*/
	  void        afficher (unsigned short indentation=0);                        // affiche le symbole en tant que noeud de l'arbre

	/*! \fn int  getValeur();
		\brief Getter de la valeur.

       Cette fonction retourne la valeur du symbole.
		\return La valeur du symbole valué
	 */
	  inline int  getValeur()              { return valeur;                     } // accesseur

	/*! \fn int  setValeur(int valeur);
		\brief Setter de la valeur.

       Cette fonction donne la valeur valeur à celle du Symbole
		\param int valeur - la valeur du symbole
	 */
	  
	  inline void setValeur(int valeur)    { this->valeur=valeur; defini=true;  } // accesseur
	  
	/*! \fn bool estDefini();
		\brief Test de la valeur.

       Cette fonction renvoie défini.
		\return Un booléen selon la définition de la valeur.
	 */
	  inline bool estDefini()              { return defini;                     } // accesseur
	  
	  friend ostream & operator << (ostream & cout, SymboleValue symb); // affiche un symbole value sur cout

private:
	/*! \var bool defini
		\brief Indique si la valeur est connue ou non.
	 */
	  bool defini;	// indique si la valeur du symbole est définie
	  /*! \var int valeur
		\brief La valeur du symbole.
	 */
	  int  valeur;	// valeur du symbole si elle est définie, zéro sinon

};

#endif /* SYMBOLEVALUE_H */
